#include <stdio.h.>
#include <stdlib.h>

// ��һ:��������ÿ����һλ���ƶ�m��
int ArrayShift(int *a, int n, int m);
int main()
{
    int *p = 0;
    int n, m;
    scanf("%d %d", &n, &m);
    m %= n;
    p = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &p[i]);
    }

    ArrayShift(p, n, m);

    for (int j = 0; j < n; j++)
    {
        printf("%d", p[j]);
        if (j < n - 1)
        {
            printf(" ");
        }
    }
    free(p);

    return 0;
}

int ArrayShift(int *a, int n, int m)
{
    int temp;
    while (m--)
    {
        temp = a[n - 1];
        for (int i = n - 1; i > 0; i--)
        {
            a[i] = a[i - 1];
        }
        a[0] = temp;
    }
    return 0;
}

// ������ֱ�Ӵ�ӡ��
/*
int main()
{
    int *p = 0;
    int n, m;
    scanf("%d %d", &n, &m);
    m %= n;
    p = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &p[i]);
    }
    for (int i = n - m; i < n; i++)
    {
        printf("%d ", p[i]);
    }
    for (int j = 0; j < n - m; j++)
    {
        printf("%d", p[j]);
        if(j != n - m - 1)
        {
            printf(" ");
        }
    }
    free(p);

    return 0;
}
*/

// 7-5 数组元素循环右移问题 (20分)
// 一个数组A中存有N（>0）个整数，在不允许使用另外数组的前提下，将每个整数循环向右移M（≥0）个位置，即将A中的数据由（A
// ​0
// ​​ A
// ​1
// ​​ ⋯A
// ​N−1
// ​​ ）变换为（A
// ​N−M
// ​​ ⋯A
// ​N−1
// ​​ A
// ​0
// ​​ A
// ​1
// ​​ ⋯A
// ​N−M−1
// ​​ ）（最后M个数循环移至最前面的M个位置）。如果需要考虑程序移动数据的次数尽量少，要如何设计移动的方法？

// 输入格式:
// 每个输入包含一个测试用例，第1行输入N（1≤N≤100）和M（≥0）；第2行输入N个整数，之间用空格分隔。

// 输出格式:
// 在一行中输出循环右移M位以后的整数序列，之间用空格分隔，序列结尾不能有多余空格。

// 输入样例:
// 6 2
// 1 2 3 4 5 6

      
    
// 输出样例:
// 5 6 1 2 3 4